package dao;

import beans.Matiere;
import beans.Utilisateur;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import static dao.DAOUtilitaire.*; 
import java.util.ArrayList;

/**
 *
 * @author florianpf
 */
public class MatiereDAOImpl implements MatiereDAO{
    
    private DAOFactory  daoFactory;
       
    private static final String SQL_SELECT_PAR_IDMATIERE = "SELECT id_matiere, libelle_matiere FROM matiere m, affecte_matiere_utilisateur a, utilisateur u WHERE m.id_matiere = a.matiere AND a.utilisateur = u.id_utilisateur AND u.id_utilisateur = ?"; 
    private static final String SQL_INSERT = "INSERT INTO matiere (libelle_matiere) VALUES (?)"; 
    private static final String SQL_SELECT_ALL_MATIERE = "SELECT * FROM matiere";
    
     public MatiereDAOImpl(DAOFactory daoFactory) {
        this.daoFactory = daoFactory;
    }
    
 /**
 * Simple méthode utilitaire permettant de faire la correspondance (le
 * mapping) entre une ligne issue de la table des utilisateurs (un
 * ResultSet) et un bean Utilisateur.
 */
    private static Matiere map( ResultSet resultSet ) throws SQLException {
        Matiere matiere = new Matiere();
        matiere.setIdMatiere( resultSet.getInt("id_matiere"));
        matiere.setLibelleMatiere(resultSet.getString("libelle_matiere"));
       return matiere;
    }  
    
    @Override
    public List<Matiere> matieresEnseignees(Integer idProfesseur) throws IllegalArgumentException, DAOException{
        
        Connection connexion = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        List<Matiere> matieres = new ArrayList<Matiere>();

        try {
            /* Récupération d'une connexion depuis la Factory */
            connexion = daoFactory.getConnection();
            preparedStatement = initialisationRequetePreparee( connexion, SQL_SELECT_PAR_IDMATIERE, true, idProfesseur);
            resultSet = preparedStatement.executeQuery();            

            while(resultSet.next()){
               matieres.add(map(resultSet));
            }
            return matieres;    
            
        } catch ( SQLException e ) {
            throw new DAOException( e );
        } finally {
            fermeturesSilencieuses( resultSet, preparedStatement, connexion );
        }
    }
    
    @Override
    public void creerMatiere(Matiere mat) throws IllegalArgumentException, DAOException{
        
        Connection connexion = null;
        PreparedStatement preparedStatement = null;
        ResultSet valeursAutoGenerees = null;
        
        try {
            /* Récupération d'une connexion depuis la Factory */
            connexion = daoFactory.getConnection();
            preparedStatement = initialisationRequetePreparee( connexion, SQL_INSERT, true, mat.getLibelleMatiere());
            int statut = preparedStatement.executeUpdate();
            /* Analyse du statut retourné par la requête d'insertion */
            if ( statut == 0 ) {
                throw new DAOException( "Échec de la création de la matière, aucune ligne ajoutée dans la table." );
            }
            /* Récupération de l'id auto-généré par la requête d'insertion */
            valeursAutoGenerees = preparedStatement.getGeneratedKeys();
            if ( valeursAutoGenerees.next() ) {
                /* Puis initialisation de la propriété id du bean Matière avec sa valeur */
                mat.setIdMatiere( valeursAutoGenerees.getInt( 1 ) );
            } else {
                throw new DAOException( "Échec de la création de la matière en base, aucun ID auto-généré retourné." );
            }
        } catch ( SQLException e ) {
            throw new DAOException( e );
        } finally {
            fermeturesSilencieuses( valeursAutoGenerees, preparedStatement, connexion );
        }
    }

    
      public List<Matiere> toutesLesMatieres() throws DAOException, DAOException{
        
        Connection connexion = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        List<Matiere> util = new ArrayList<Matiere>();

        try {
            /* Récupération d'une connexion depuis la Factory */
            connexion = daoFactory.getConnection();
            preparedStatement = initialisationRequetePreparee( connexion, SQL_SELECT_ALL_MATIERE, true);
            resultSet = preparedStatement.executeQuery();            

            while(resultSet.next()){
               util.add(map(resultSet));
            }
            return util;    
            
        } catch ( SQLException e ) {
            throw new DAOException( e );
        } finally {
            fermeturesSilencieuses( resultSet, preparedStatement, connexion );
        }
    }
 
}
